package com.assistant.command;

import com.assistant.ai.NLUModule;
import com.assistant.command.impl.AnswerQuestionCommand;
import com.assistant.command.impl.OpenAppCommand;
import com.assistant.command.impl.OpenUrlCommand;
import com.assistant.command.impl.CreateTextCommand;
import com.assistant.command.impl.PlayMusicCommand;
import com.assistant.core.CommandData;
import com.assistant.ai.TTSModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.List;


/**
 * @author Anyang
 * @version 1.0.0
 * @date 2025/10/25 05:10:52
 * @description 命令调度器：仅负责查找并执行与 action 匹配的 Command。
 */
public class CommandDispatcher {
    private static final Logger logger = LoggerFactory.getLogger(CommandDispatcher.class);
    private final List<Command> availableCommands;

    public CommandDispatcher(NLUModule nluModule, TTSModule ttsModule) {
        // 注册所有可用的命令执行器
        this.availableCommands = Arrays.asList(
                new OpenAppCommand(),
                new OpenUrlCommand(),
                new CreateTextCommand(nluModule),
                new AnswerQuestionCommand(nluModule, ttsModule),
                new PlayMusicCommand()
        );
        logger.info("指令调度器初始化成功，共注册 {} 个指令执行器。", availableCommands.size());
    }

    /**
     * 根据 CommandData 中的 action，调度到正确的 Command 实现并执行。
     * @param data NLU解析出的结构化命令
     * @return 执行结果（用于 TTS 反馈的文本）
     */
    public String dispatch(CommandData data) {
        String action = data.getAction().toLowerCase();

        // 【重构】所有 error/empty 检查已移至 AssistantEngine
        // 调度器只负责 happy path

        for (Command command : availableCommands) {
            if (command.supports(action)) {
                logger.info("调度成功：{} 指令被 {} 处理。", action, command.getClass().getSimpleName());
                return command.execute(data);
            }
        }

        // 兜底：未找到
        logger.warn("未找到支持动作 {} 的指令执行器。", action);
        return String.format("对不起，我无法执行指令【%s】。", action);
    }
}